/**
 * 媒体资源的转化
 * 大图转小图  大图取缩略图 获取取文件名 图片或视频尺寸 视频封面 等 （待开发完善 当前只处理了视频且只支持File对象）
 * @Author T 1755885716@qq.com
 * @Date 2022/09/19
 */
import ajax from "../axios-core";
export default {
	/**
	 * 从获取媒体文件获取一帧图像作为封面图
	 * @param {*} files 文件对象
	 * @returns 
	 */
	getFileInfo(files){
		return new Promise((resolve, reject)=>{
			if(!files || !files.name){
				reject(false);
				console.warn('文件对象无效')
				return;
			}
			const isLt100M = files.size / 1024 / 1024 < 100  //100M大小
			const size = files.size / 1024 / 1024  //文件大小单位为M,(做限制条件用)
			// console.log(files)
			//if (files.type.indexOf('mp4') === -1) { //如果不是视频格式(限制格式判断)
				//alert('请选择mp4文件')
			//}
			const reader = new FileReader(); // 创建读取文件对象
			reader.readAsDataURL(files); // 发起异步请求，读取文件
			reader.onload = function(t) { // 文件读取完成后
				// console.log(t.target.result)//视频路径（可能已经不叫路径了，现在就是个数据流文件（@~__~@））
				let video = document.createElement("video");
				video.setAttribute('src', t.target.result);
				video.setAttribute('controls', 'controls');
				// video.setAttribute('width', 400); //设置大小，如果不设置，下面的canvas就要按需设置
				// video.setAttribute('height', 240);
				video.currentTime = 7  //视频时长，一定要设置，不然大概率白屏
				video.addEventListener('loadeddata', function() {
					let canvas = document.createElement("canvas"),
					width = video.width, //canvas的尺寸和图片一样
					height = video.height;
					canvas.width = width;//画布大小，默认为视频宽高
					canvas.height = height;
					canvas.getContext("2d").drawImage(video, 0, 0, width, height); //绘制canvas
					let dataURL = canvas.toDataURL('image/png'); //转换为base64
					resolve({
						width,
						height,
						duration:video.duration,
						cover:dataURL,
						name:files.name,
					})
					// console.log(dataURL,video.duration)
					// video.setAttribute('poster', dataURL);//设置为视频封面
					// document.getElementById('a123').setAttribute('src', dataURL)
					// document.getElementById('output').appendChild(canvas)//可以放到页面上看看效果
					//document.getElementById('output').appendChild(video)
				});
			};
		})
	},
	/**
	 * 图片压缩
	 * @param {*} file 
	 * @param {*} bindEl 绑定到el显示 如果传参则须为img节点元素
	 * @param {*} option maxWidth: 最大宽度,maxHeight: 最大高度,quality 取样精度
	 * @param {*} fileType 文件输出格式  默认file对象  可以是base64   blob
	 */
	imgZip(file,bindEl,option={maxWidth: 1000,maxHeight: 1000,quality: 0.8},fileType='file'){
		return new Promise((resolve, reject) => {
			if(!files || !files.name){
				reject(false);
				console.warn('文件对象无效')
				return;
			}
			const reader = new FileReader();
			reader.onload = async (e) => {
				const img = new Image();
				img.onload = async () => {
					// 计算缩放比例
					let scale = 1;
					if (img.width > options.maxWidth || img.height > options.maxHeight) {
						scale = Math.min(options.maxWidth / img.width, options.maxHeight / img.height);
					}
					// 创建 canvas 元素
					const canvas = document.createElement('canvas');
					const ctx = canvas.getContext('2d');
					canvas.width = img.width * scale;
					canvas.height = img.height * scale;
					// 在 canvas 上绘制缩放后的图片
					ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
			
					// 获取压缩后的图片数据
					let compressedData;
					if (fileType === 'base64') {
						compressedData = canvas.toDataURL('image/jpeg', options.quality);
						// 显示压缩后的图片
						if (bindEl && bindEl.tagName.toLowerCase() === 'img') {
							bindEl.src = compressedData;
						}
						resolve(compressedData);
					} else {
						canvas.toBlob((blob) => {
							if (fileType === 'blob') {
								compressedData = blob;
							} else {
								// 默认返回 File 对象
								compressedData = new File([blob], file.name, { type: 'image/jpeg' });
							}
							// 显示压缩后的图片
							if (bindEl && bindEl.tagName.toLowerCase() === 'img') {
								bindEl.src = compressedData;
							}
							resolve(compressedData);
						}, 'image/jpeg', options.quality);
						return;
					}
				};
			};
			reader.readAsDataURL(file);
		});
	},
	/**
	 * 获取缩略图
	 * 如果图片小于指定尺寸直接输出原图
	 * @param {*} file 
	 * @param {*} bindEl 绑定到el显示 如果传参则须为img节点元素
	 * @param {*} option width宽度 height高度 quality取样精度  model裁剪模式，默认center：居中裁剪，保留图片的中心部分； 可以是Fill：将图片缩放至指定的尺寸，然后填充到指定的画布尺寸；Fit：将图片缩放至指定的尺寸，以适应画布的最大尺寸，不会改变图片的纵横比例；Stretch：将图片强制拉伸至指定的尺寸，可能导致图片变形。
	 * @param {*} fileType 文件输出格式  默认file对象  可以是base64   blob
	 */
	imgThumb(file,bindEl,option={width: 100,height: 100,quality: 0.8,model:'center'},fileType='file'){
		return new Promise((resolve, reject) => {
			if(!files || !files.name){
				reject(false);
				console.warn('文件对象无效')
				return;
			}
			const reader = new FileReader();
			reader.onload = (e) => {
				const img = new Image();
				img.onload = () => {
					const canvas = document.createElement('canvas');
					const context = canvas.getContext('2d');
	
					const imgWidth = img.width;
					const imgHeight = img.height;
	
					if (imgWidth <= option.width && imgHeight <= option.height) {
						if (fileType === 'base64') {
							resolve(e.target.result);
						} else if (fileType === 'blob') {
							resolve(new Blob([file], { type: file.type }));
						} else {
							resolve(file);
						}
						if (bindEl) {
							bindEl.src = e.target.result;
						}
						return;
					}
	
					canvas.width = option.width;
					canvas.height = option.height;
	
					let sx = 0, sy = 0, sWidth = imgWidth, sHeight = imgHeight;
					let dx = 0, dy = 0, dWidth = option.width, dHeight = option.height;
	
					switch (option.model) {
						case 'Fill':
							context.drawImage(img, 0, 0, option.width, option.height);
							break;
						case 'Fit':
							const fitScale = Math.min(option.width / imgWidth, option.height / imgHeight);
							dWidth = imgWidth * fitScale;
							dHeight = imgHeight * fitScale;
							dx = (option.width - dWidth) / 2;
							dy = (option.height - dHeight) / 2;
							context.drawImage(img, dx, dy, dWidth, dHeight);
							break;
						case 'Stretch':
							context.drawImage(img, 0, 0, option.width, option.height);
							break;
						default:
							const scale = Math.max(option.width / imgWidth, option.height / imgHeight);
							sWidth = option.width / scale;
							sHeight = option.height / scale;
							sx = (imgWidth - sWidth) / 2;
							sy = (imgHeight - sHeight) / 2;
							context.drawImage(img, sx, sy, sWidth, sHeight, 0, 0, option.width, option.height);
							break;
					}
	
					if (bindEl) {
						bindEl.src = canvas.toDataURL();
					}
	
					if (fileType === 'base64') {
						resolve(canvas.toDataURL('image/jpeg', option.quality));
					} else if (fileType === 'blob') {
						canvas.toBlob(blob => {
							resolve(blob);
						}, 'image/jpeg', option.quality);
					} else {
						canvas.toBlob(blob => {
							const newFile = new File([blob], file.name, { type: 'image/jpeg' });
							resolve(newFile);
						}, 'image/jpeg', option.quality);
					}
				};
	
				img.src = e.target.result;
			};
	
			reader.onerror = (error) => {
				reject(error);
			};
	
			reader.readAsDataURL(file);
		});
	},
	/**
	 * 图片裁剪
	 * @param {*} file 
	 * @param {*} bindEl 绑定到el显示 如果传参则须为img节点元素
	 * @param {*} option from开始坐标，to结束坐标,width输出图片宽度 height输出图片高度 quality取样精度
	 * @param {*} fileType 文件输出格式  默认file对象  可以是base64   blob
	 */
	imgCut(file,bindEl,option={from:{x:0,y:0},to:{x:0,y:0},width: 100,height: 100,quality: 0.8},fileType='file'){
		return new Promise((resolve, reject) => {
			if(!files || !files.name){
				reject();
				console.warn('文件对象无效')
				return;
			}
			const reader = new FileReader();
			reader.onload = (e) => {
				const img = new Image();
				img.onload = () => {
					const canvas = document.createElement('canvas');
					const context = canvas.getContext('2d');
					// 设置canvas尺寸
					canvas.width = option.width;
					canvas.height = option.height;
					// 计算裁剪区域宽高
					const cropWidth = option.to.x - option.from.x;
					const cropHeight = option.to.y - option.from.y;
					// 在canvas上绘制裁剪后的图像
					context.drawImage(img, option.from.x, option.from.y, cropWidth, cropHeight, 0, 0, option.width, option.height);
					if (bindEl) {
						bindEl.src = canvas.toDataURL();
					}
					if (fileType === 'base64') {
						resolve(canvas.toDataURL('image/jpeg', option.quality));
					} else if (fileType === 'blob') {
						canvas.toBlob(blob => {
							resolve(blob);
						}, 'image/jpeg', option.quality);
					} else {
						canvas.toBlob(blob => {
							const newFile = new File([blob], file.name, { type: 'image/jpeg' });
							resolve(newFile);
						}, 'image/jpeg', option.quality);
					}
				};
	
				img.src = e.target.result;
			};
	
			reader.onerror = (error) => {
				reject(error);
			};
	
			reader.readAsDataURL(file);
		});
	},
	/**
	 * 获取网络资源转为本地Blob对象 默认超时1分钟 可修改
	 * @param {*} url 
	 * @param {*} data 
	 * @param {*} callback 
	 * @param {*} config 
	 * @returns 
	 */
	getWebSourceToBlob(url,data={},callback=null,config={}){
		return ajax.get(url,data,callback,{
			timeout:60000,
			responseType: 'blob',
			...config,
		})
	},
	/**
	 * blob转为base64
	 * @param {*} blob 
	 * return Promise
	 */
	blobToBase(blob){
		return new Promise((resolve, reject) => {
			const reader = new FileReader();
			reader.onload = () => {
				const base64String = reader.result
				resolve(base64String);
			};
			reader.onerror = (error) => {
				reject(error);
			};
			reader.readAsDataURL(blob);
		});
	},
	/**
	 * base64转为blob
	 * @param {*} dataUri 
	 */
	baseToBlob(dataUri){
		// 提取 MIME 类型和 Base64 数据部分
		const splitIndex = dataUri.indexOf(',');
		const mimeType = dataUri.substring(5, splitIndex); // 5 是因为 data: 后面的部分长度
		const base64String = dataUri.substring(splitIndex + 1);
	  
		// 解码 Base64 数据为二进制数据
		const byteCharacters = atob(base64String);
		const byteNumbers = new Array(byteCharacters.length);
		for (let i = 0; i < byteCharacters.length; i++) {
		  byteNumbers[i] = byteCharacters.charCodeAt(i);
		}
		const byteArray = new Uint8Array(byteNumbers);
	  
		// 创建 Blob 对象
		return new Blob([byteArray], { type: mimeType });
	},
	/**
	 * blob转为file对象
	 * @param {*} blob 
	 * @param {*} fileName
	 */
	blobToFileObj(blob,fileName='file'){
		return new File([blob], fileName, { type: blob.type });
	},
	/**
	 * file对象转为blob
	 * @param {*} file 
	 */
	fileObjToBlob(file){
		return file.slice(0, file.size, file.type);
		// 该方法需要使用promise方式返回或者callbank  能直接返回就直接返回吧
	    // if (file) {
		// 	// 将 File 对象转换为 Blob
		// 	const reader = new FileReader();
		// 	reader.onload = (e) => {
		// 		const blob = new Blob([e.target.result], { type: file.type });
		// 		const newFile = this.blobToFile(blob, file.name);
		// 		console.log(newFile);  // 输出新的 File 对象
		// 	};
		// 	reader.readAsArrayBuffer(file);
		// }
	},
	/**
	 * file对象转为base64
	 * @param {*} file 
	 */
	fileObjToBase(file){
	    return new Promise((resolve, reject) => {
			const reader = new FileReader();
		
			reader.onload = () => {
				const base64String = reader.result;
				resolve(base64String);
			};
		
			reader.onerror = (error) => {
				reject(error);
			};
		
			reader.readAsDataURL(file);
		});
	},
	/**
	 * base64转为file对象
	 * @param {*} base 
	 */
	baseToFileObj(dataUri,fileName='file'){
	    let blob = this.baseToBlob(dataUri)
		return new File([blob], fileName, { type: blob.type });
	},

}